package main

import (
	"context"
	"fmt"
	"github.com/olivere/elastic/v7"
	"log"
)

func main() {
	// 新增
	//add()
	// 查询
	//gets()
	// 删除
	//delete()
	// 更新字段
	update()
}

//查找
func gets() {
	client, err := elastic.NewClient(elastic.SetURL("http://10.10.192.220:52101"), elastic.SetSniff(false),
		elastic.SetMaxRetries(3))
	//通过id查找
	get1, err := client.Get().Index("yyy").Type("_doc").Id("wxZZJooBwEsrQsx9euli").Do(context.Background())
	if err != nil {
		panic(err)
	}
	if get1.Found {
		fmt.Printf("Got document %s in version %d from index %s, type %s\n", get1.Id, get1.Version, get1.Index, get1.Type)
	}
}

func query() {
	client, err := elastic.NewClient(elastic.SetURL("http://10.10.192.220:52101"), elastic.SetSniff(false),
		elastic.SetMaxRetries(3))
	if err != nil {
		log.Fatal(err)
	}
	//通过id查找
	temp := client.Get().Index("yyy").Id("wxZZJooBwEsrQsx9euli")
	get, err := temp.Do(context.Background())
	if err != nil {
		panic(err)
	}
	if get.Found {
		fmt.Print("查询的到的索引为" + get.Index)
	}
	source, err := get.Source.MarshalJSON()

	if err != nil {
		fmt.Printf("byte convert string failed, err: %v", err)
	}
	bytes := []byte(source) // source 数据流
	str_data := string(bytes)
	fmt.Print(str_data)
}

// 定义结构体
type Tweet struct {
	User    string
	Message string
	Age     int
}

// Indexed tweet 到索引 yyy, type _doc
func add() {
	ctx := context.Background() // 定义上下文
	client, err := elastic.NewClient(elastic.SetURL("http://10.10.192.220:52101"), elastic.SetSniff(false),
		elastic.SetMaxRetries(3))
	//client,err :=elastic.NewClient(elastic.SetURL("http://10.10.192.220:52101"),elastic.SetBasicAuth("user","pwd")) //有账号密码这样设置
	if err != nil {
		log.Fatal(err)
	}
	// 插入第一条数据
	tweet1 := Tweet{User: "knight", Message: "hello2", Age: 28}
	put1, err := client.Index().
		Index("yyy"). // 指定索引
		//Id("1") // 不指定id
		BodyJson(tweet1). //也就是source字段
		Do(ctx)
	if err != nil {
		// Handle error
		panic(err)
	}
	fmt.Printf("Indexed tweet 到索引 %s, type %s\n", put1.Index, put1.Type)

}

func delete() {
	client, err := elastic.NewClient(elastic.SetURL("http://10.10.192.220:52101"))
	if err != nil {
		log.Fatal(err)
	}
	res, err := client.Delete().Index("yyy").
		Id("yHpeQW8BhGBtm81xkxoY").
		Do(context.Background())
	if err != nil {
		println(err.Error())
		return
	}
	fmt.Printf("delete result %s\n", res.Result)
}

// 更新字段
func update() {
	client, err := elastic.NewClient(elastic.SetURL("http://10.10.192.220:52101"), elastic.SetSniff(false),
		elastic.SetMaxRetries(3))
	res, err := client.Update().Type("_doc").
		Index("yyy").
		Id("whZZJooBwEsrQsx9euli").
		Doc(map[string]interface{}{"Age": 88}).
		Do(context.Background())
	if err != nil {
		println(err.Error())
	}
	fmt.Printf("更新年龄字段 %s\n", res.Result)
}
